package com.huijie.app.u.shiro.impl;


import com.google.common.collect.Sets;
import com.huijie.app.u.entity.User;
import com.huijie.app.u.service.IUserRoleService;
import com.huijie.app.u.service.IUserService;
import com.huijie.core.constant.BusinessConstants;
import org.apache.shiro.authc.AuthenticationException;
import org.jsets.shiro.model.Account;
import org.jsets.shiro.service.ShiroAccountProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
* @ClassName: AccountProviderImpl
* @Description: 账号信息提供者实现
* @author Alex
* @date 2018年6月29日 下午5:12:32
*/
@Service
public class AccountProviderImpl implements ShiroAccountProvider {

	@Autowired
	private IUserService userService;
	@Autowired
	private IUserRoleService userRoleService;

	@Override
	public Account loadAccount(String account) throws AuthenticationException {
		User user = userService.getUserByloginName(account);
		// 用户不存在
		if(null == user){
			throw new AuthenticationException("账号或密码错误");
		}
		// 对账号做检查
		// 当账号异常，如账号被锁定、被禁用等等需要限制登陆，直接抛出AuthenticationException即可
		if(BusinessConstants.SYS_USER_STATUS_LOCK.getCode().equals(user.getUserStatus())){
			throw new AuthenticationException("账号已被锁定，请联系系统管理员");
		}
		return user;
	}
	
	
	/** 
	 * 加载用户持有的角色
	 */
	@Override
	public Set<String> loadRoles(String account) {
		return Sets.newHashSet(userRoleService.listUserRoles(account));
	}
	
	
	/**
	 * 
	 * 系统采用  基于角色的权限访问控制(RBAC)策略
	 * 所谓的权限通常可以理解为用户所能操作的资源，如（user:add、user:delete）
	 * 此方法未实现
	 */ 
	@Override
	public Set<String> loadPermissions(String account) {
		return null;
	}
}